package com.zyx.javademo.enumdemo;

/**
 * @author Yaxi.Zhang
 * @since 2021/6/29 10:56
 * desc: Weekday枚举案例
 */
public class WeekdayDemo {
    public static void main(String[] args) {
        weekdayValuesDemo();
    }

    private static void weekdayValuesDemo() {
        // 调用 values()
        Weekday[] arr = Weekday.values();
        // 迭代枚举
        for (Weekday col : arr)
        {
            // 查看索引
            System.out.println(col + " at index " + col.ordinal());
        }
        // 使用 valueOf() 返回枚举常量，不存在的会报错 IllegalArgumentException
        Weekday mon = Weekday.valueOf("MON");
        System.out.println(mon);
        System.out.println(Weekday.valueOf("FEB"));
    }

    private static void weekdayOrdinalDemo() {
        // 返回定义的常量的顺序，从0开始计数
        // Note: 改变枚举常量定义的顺序就会导致ordinal()返回值发生变化。
        int n = Weekday.MON.ordinal();
        System.out.println("MON is the " + n + "th day of weekday");
    }

    private static void weekdayNameDemo() {
        // 获取weekday枚举类变量名称
        String s = Weekday.SUN.name();
        System.out.println("sun ==> " + s);
    }

    private static void weekdayCompDemo() {
        /*
            使用enum定义枚举有如下好处：
                首先，enum常量本身带有类型信息，即Weekday.SUN类型是Weekday，编译器会自动检查出类型错误
                其次，不可能引用到非枚举的值，因为无法通过编译
                最后，不同类型的枚举不能互相比较或者赋值，因为类型不符。例如，不能给一个Weekday枚举类型的变量赋值为Color枚举类型的值
         */
        Weekday day = Weekday.SUN;
        /*
            使用enum定义的枚举类是一种引用类型。前面我们讲到，引用类型比较，要使用equals()方法，如果使用==比较，它比较的是两个引用类型的变量是否是同一个对象。
            因此，引用类型比较，要始终使用equals()方法，但enum类型可以例外。
            这是因为enum类型的每个常量在JVM中只有一个唯一实例，所以可以直接用==比较：
                if (day == Weekday.FRI) { // ok!
                }
                if (day.equals(Weekday.SUN)) { // ok, but more code!
                }
         */
        if (day == Weekday.SAT || day == Weekday.SUN) {
            System.out.println("Work at home!");
        } else {
            System.out.println("Work at office!");
        }
    }
}
